-- 最先加载，不能使用任何外部插件提供的功能

vim.keymap.set("n", "<space>wj", "<C-W>-", { desc = "increase window height" })
vim.keymap.set("n", "<space>wk", "<C-W>+", { desc = "decrease window height" })
vim.keymap.set("n", "<space>wh", "<C-W>>", { desc = "increase window width" })
vim.keymap.set("n", "<space>wl", "<C-W><", { desc = "decrease window width" })

vim.keymap.set("n", "<C-k>", "<C-w>k", { desc = "vertical inc" })
vim.keymap.set("n", "<C-l>", "<C-w>l", { desc = "vertical dec" })
vim.keymap.set("n", "<C-h>", "<C-w>h", { desc = "horizontal inc" })
vim.keymap.set("n", "<C-j>", "<C-w>j", { desc = "horizontal dec" })

vim.keymap.set("n", ",so", ":source ~/.config/nvim/init.lua<cr>", { desc = "re-source init.lua" })
vim.keymap.set("n", ",se", ":tabnew ~/.config/nvim/init.lua<cr>", { desc = "open init.lua in new tab" })

vim.keymap.set(
    "n",
    "<F2>",
    "<esc>:restart lua vim.cmd('so ~/.config/nvim_session.vim')<cr>",
    { noremap = true, silent = true },
    { desc = "restart and load nvim session" }
)
vim.keymap.set("n", "<F3>", "<esc>:lua vim.cmd('so ~/.config/nvim_session.vim')<cr>", {})
vim.keymap.set("n", "<F5>", "@@", { noremap = true, silent = true })

vim.keymap.set("n", ",rn", [[:%s/\s\+$//g<cr>]], { desc = "remove whitespace at the end" }) -- 删除行尾空白
vim.keymap.set("n", ",rg", [[:%s/^\n\+\r/g<cr>]], { desc = "remove several space lines" }) -- 删除连续空行

vim.keymap.set("n", "j", "gj", {})
vim.keymap.set("n", "k", "gk", {})
vim.keymap.set("n", "<C-P>", ":cp<cr>", {})
vim.keymap.set("n", "<C-N>", ":cn<cr>", {})
vim.keymap.set("n", "<space>1", "1gt", { desc = "tab 1" })
vim.keymap.set("n", "<space>2", "2gt", { desc = "tab 2" })
vim.keymap.set("n", "<space>3", "3gt", { desc = "tab 3" })
vim.keymap.set("n", "<space>4", "4gt", { desc = "tab 4" })
vim.keymap.set("n", "<space>5", "5gt", { desc = "tab 5" })
vim.keymap.set("n", "<space>6", "6gt", { desc = "tab 6" })
vim.keymap.set("n", "<space>7", "7gt", { desc = "tab 7" })
vim.keymap.set("n", "<space>8", "8gt", { desc = "tab 8" })
vim.keymap.set("n", "<space>9", "9gt", { desc = "tab 9" })
vim.keymap.set("n", "<tab>", ":tabn<cr>", {})
vim.keymap.set("n", "<S-tab>", ":tabp<cr>", {})
vim.keymap.set("n", "<space>dw", ":setlocal wrapscan!<cr>", {})
vim.keymap.set("n", "<space>dh", ":noh<cr>", {})
vim.keymap.set("n", "<space>dn", ":setlocal modifiable", {})
vim.keymap.set("n", "<space>wq", ":close<cr>", {})

vim.keymap.set("n", "<space>wo", ":tabnew ~/tmp/tmp.md<cr>", { desc = "open new tab" })
vim.keymap.set("n", "<space>wt", ":vs ~/tmp/tmp.md<cr>", { desc = "open vertical window" })
vim.keymap.set({ "i", "n" }, "<C-s>", "<esc>:update<cr>")

vim.keymap.set("i", "<M-;>", "<ESC>A;", {})
vim.keymap.set("i", "<M-b>", "begin<cr>end<esc>O", {})

vim.keymap.set({ "i", "c" }, "<M-j>", "<Down>", {})
vim.keymap.set({ "i", "c" }, "<M-k>", "<Up>", {})

vim.keymap.set("!", "<M-h>", "<left>", {})
vim.keymap.set("!", "<M-l>", "<Right>", {})
vim.keymap.set("!", "<C-v>", "<C-r>+", {})
vim.keymap.set("!", "<C-h>", "<S-Left>", {})
vim.keymap.set("!", "<C-l>", "<S-Right>", {})

vim.keymap.set("t", "<Esc>", [[<C-\><C-n>]], {})
vim.keymap.set("t", "<C-k>", "<C-\\><C-N><C-w>k", {})
vim.keymap.set("t", "<C-l>", "<C-\\><C-N><C-w>l", {})
vim.keymap.set("t", "<C-h>", "<C-\\><C-N><C-w>h", {})
vim.keymap.set("t", "<C-j>", "<C-\\><C-N><C-w>j", {})

vim.keymap.set("n", "<space>do", function()
    if vim.api.nvim_eval('has("unix")') == 1 then
        os.execute("open .")
    else
        os.execute("explorer .")
    end
end, { desc = "open current directory" })

vim.keymap.set("n", ",re", function()
    local word = vim.fn.input("Replace [" .. vim.fn.expand("<cword>") .. "] with: ")
    if word ~= "" then
        vim.api.nvim_exec([[:%s/\C\<]] .. vim.fn.expand("<cword>") .. [[\>/]] .. word .. [[/ge | update]], true)
    end
end, { desc = "replace word" })

vim.keymap.set("n", "<space>gc", function()
    vim.api.nvim_command("!git checkout %")
end, { desc = "checkout current buffer" })

vim.keymap.set("n", "<space>gr", function()
    vim.api.nvim_command("!git reset HEAD %")
end, { desc = "reset buffer" })

vim.keymap.set("n", "<space>gv", function()
    --TODO: 切换到根目录, 执行此命令
    vim.api.nvim_command("!git archive -o master.zip HEAD")
end, { desc = "archive project" })

vim.keymap.set("n", "<space>gg", function()
    vim.fn.jobstart("gitk --all")
end, { desc = "gitk --all" })

vim.keymap.set("n", "<space>dp", function()
    if vim.fn.exepath("pyinstaller") == "" then
        vim.notify("Please install pyinstaller!")
        return
    end
    if vim.opt.filetype:get() ~= "python" then
        vim.notify("This file is not python!")
        return
    end
    vim.nvim_exec("!pyinstaller -F -w  %")
end, { desc = "pyinstaller file" })
